package net.chasing.retrofit.util;

import com.google.gson.Gson;
import com.google.gson.JsonNull;
import com.google.gson.JsonSyntaxException;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;

/**
 * JSON解析
 */
public class JsonUtils {

    // 采取单例模式
    private static final Gson gson = new Gson();

    private JsonUtils() {
    }

    /**
     * @param src :将要被转化的对象
     * @return :转化后的JSON串
     */
    public static String toJson(Object src) {
        if (null == src) {
            return gson.toJson(JsonNull.INSTANCE);
        }
        try {
            return gson.toJson(src);
        } catch (Exception e) {
            RetrofitLog.e("retrofit request toJson error:" + e.getMessage());
            return null;
        }
    }

    /**
     * @param json 服务器返回的json数据
     * @return T类型数据
     */
    public static <T> T fromJson(String json, Class<T> classOfT) {
        try {
            return gson.fromJson(json, (Type) classOfT);
        } catch (JsonSyntaxException e) {
            RetrofitLog.e("retrofit request fromJson error:" + e.getMessage());
            return null;
        }
    }

    /**
     * 接收对象需要转成List<Object>则调用该方法，
     *
     * @param json 服务器返回的json数据
     * @param type new TokenType<List<T>>(){}.getType();
     * @return Object
     */
    public static <T> T fromJson(String json, Type type) {
        try {
            return gson.fromJson(json, type);
        } catch (JsonSyntaxException e) {
            RetrofitLog.e("retrofit request fromJson error:" + e.getMessage());
            return null;
        }
    }

    /**
     * @param json       服务器返回的json数据
     * @param tTypeToken new TokenType<List<T>>(){};
     * @return Object
     */
    public static <T> T fromJson(String json, TypeToken<T> tTypeToken) {
        try {
            return gson.fromJson(json, tTypeToken.getType());
        } catch (JsonSyntaxException e) {
            RetrofitLog.e("retrofit request fromJson error:" + e.getMessage());
            return null;
        }
    }
}
